﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*
	有符号的整数，三种表⽰⽅法均有符号位和数值位两部分，符号位都是⽤0表⽰“正”，⽤1表⽰“负”，最⾼位的⼀位是被当做符号位，剩余的都是数值位
	对于整形来说：数据存放内存中其实存放的是补码。
	为什么呢？
	在计算机系统中，数值⼀律⽤补码来表⽰和存储。
	原因在于，使⽤补码，可以将符号位和数值域统⼀处理；
	同时，加法和减法也可以统⼀处理（CPU只有加法器）此外，补码与原码相互转换，其运算过程是相同的，不需要额外的硬件电路。
	因此计算用的也是补码
*/
/*
	⼤端（存储）模式：是指数据的低位字节内容保存在内存的⾼地址处，⽽数据的⾼位字节内容，保存在内存的低地址处。
	⼩端（存储）模式：是指数据的低位字节内容保存在内存的低地址处，⽽数据的⾼位字节内容，保存在内存的⾼地址处。
	我们常⽤的 X86 结构是⼩端模式，⽽KEIL C51 则为⼤端模式。很多的ARM，DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端模式
*/
//int check_sys()
//{
//	union
//	{
//		int i;
//		char c;
//	}un;
//	un.i = 1;
//	return un.c;
//}
//int main(void)
//{
//	int a = 1;
//	int ret = *((char*)&a);
//	if (a == 1) printf("小端");
//	else		printf("大端");
//
//	return 0;
//}
//int main()
//{
//	char a = -1;
//	/*
//		-1:		1000 0000 0000 0000 0000 0000 0000 0001
//		反码：	1111 1111 1111 1111 1111 1111 1111 1110
//		补码：	1111 1111 1111 1111 1111 1111 1111 1111
//		a:		1111 1111
//		%d:		1111 1111 1111 1111 1111 1111 1111 1111(整型提升）
//		%d原码：	1000 0000 0000 0000 0000 0000 0000 0001（-1）
//	*/
//	signed char b = -1;
//	unsigned char c = -1;
//	/*
//		-1:		1000 0000 0000 0000 0000 0000 0000 0001
//		反码：	1111 1111 1111 1111 1111 1111 1111 1110
//		补码：	1111 1111 1111 1111 1111 1111 1111 1111		
//		c:		1111 1111
//		%d:		0000 0000 0000 0000 0000 0000 1111 1111（整型提升与c的类型有关）
//		%d原码：	0000 0000 0000 0000 0000 0000 1111 1111（正数）
//	*/
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	return 0;
//}
//int main()
//{
//	char a = -128;
//	/*
//		-128:			1000 0000 0000 0000 0000 0000 1000 0000
//		-128补码：		1111 1111 1111 1111 1111 1111 1000 0000
//		a:				1000 0000
//		a有符号整型提升：	1111 1111 1111 1111 1111 1111 1000 0000
//		%u:正数原码		1111 1111 1111 1111 1111 1111 1000 0000
//	*/
//	printf("%u\n", a);
//	return 0;
//}
//int main()
//{
//	char a = 128;
//	/*
//		128：		0000 0000 0000 0000 0000 0000 1000 0000
//		补码：		0000 0000 0000 0000 0000 0000 1000 0000
//		a:			1000 0000
//		a整型提升：	1111 1111 1111 1111 1111 1111 1000 0000
//		%u:认为正数：1111 1111 1111 1111 1111 1111 1000 0000
//	*/
//	printf("%u\n", a);
//	return 0;
//}
/*
	类型本身意义不大，关键在于我们怎么看待这个数据
*/
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}
//unsigned char i = 0;
//int main()
//{
//	//死循环
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}
//int main()
//{
//	unsigned int i;
//	//死循环
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//	}
//	return 0;
//}
//X86环境 ⼩端字节序
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%#x,%#x", ptr1[-1], *ptr2);
//	//%#x 0x--
//	return 0;
//}
/*
	
	任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式：
	V   =  (−1)^S*M*2^E
	• (−1)^S 表⽰符号位，当S=0，V为正数；当S=1，V为负数
	• M 表⽰有效数字，M是⼤于等于1，⼩于2的
	• 2^E 表⽰指数位,E为无符号数据，因此存的是修正值
	浮点数：-5
	二进制：101.1（位权2^-1=0.5）
	(-1)^0*1.011*2^2
*/
int main()
{
	float f = 5.5f;//f使其为float,默认为double
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为：%d\n", n);
	printf("*pFloat的值为：%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为：%d\n", n);
	printf("*pFloat的值为：%f\n", *pFloat);
	return 0;
}